﻿using System;
using System.Linq;
using OpenCvSharp;

namespace HistogramLr.Models
{
	/// <summary>
	/// ヒストグラム情報格納クラス。
	/// </summary>
	public class HistogramItem
	{
		// ヒストグラム格納領域.
		private long[] _bins;

		/// <summary>
		/// Constructor.
		/// CvHistogramの値からHistogramItemを生成する。
		/// </summary>
		/// <param name="cvHistogram">CvHistogram object.</param>
		/// <param name="count">要素数.</param>
		public HistogramItem(CvHistogram cvHistogram, int count)
		{
			this._bins = new long[count];
			for (int i = 0; i < count; i++)
			{
				this._bins[i] = (long)cvHistogram.QueryValue1D(i);
			}
		}

		/// <summary>
		/// 指定indexのヒストグラム値を返す。
		/// </summary>
		/// <param name="index">index</param>
		/// <returns>ヒストグラム値</returns>
		public long GetValue(int index)
		{
			return this._bins[index];
		}

		/// <summary>
		/// 指定indexのヒストグラム値をmaxValueに収まるように補正して返す。
		/// </summary>
		/// <param name="index">index</param>
		/// <param name="maxValue">補正後の最大値</param>
		/// <param name="graphScale">描画するヒストグラムのスケール値</param>
		/// <returns>補正したヒストグラム値</returns>
		public long GetFixedValue(int index, int maxValue, double graphScale)
		{
			// 使用するヒストグラム領域の最大値を決定。
			// ヒストグラムの最大値を使用すると、特定の輝度レベルが突出する事があるため平均値を使用。
			long histValueLimit = (long)(this._bins.Average() * graphScale);

			// 指定したmaxValue内に収まるように値を補正して返す。
			return (long)Math.Round((double)this._bins[index] * (double)maxValue / (double)histValueLimit);
		}
	}
}
